home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Compilers⁄Interps / GCC-2.3.3r12 / Sources / print-rtl.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-05-11  |  6.4 KB  |  285 lines  |  [TEXT/MPS ]

  1. /* Print RTL for GNU C Compiler.
  2.    Copyright (C) 1987-1991 Free Software Foundation, Inc.
  3.  
  4. This file is part of GNU CC.
  5.  
  6. GNU CC is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 2, or (at your option)
  9. any later version.
  10.  
  11. GNU CC is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU General Public License for more details.
  15.  
  16. You should have received a copy of the GNU General Public License
  17. along with GNU CC; see the file COPYING.  If not, write to
  18. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  19.  
  20.  
  21. #include "config.h"
  22. #include <ctype.h>
  23. #include <stdio.h>
  24. #include "rtl.h"
  25.  
  26.  
  27. /* How to print out a register name.
  28.    We don't use PRINT_REG because some definitions of PRINT_REG
  29.    don't work here.  */
  30. #ifndef DEBUG_PRINT_REG
  31. #define DEBUG_PRINT_REG(RTX, CODE, FILE) \
  32.   fprintf ((FILE), "%d %s", REGNO (RTX), reg_names[REGNO (RTX)])
  33. #endif
  34.  
  35. /* Array containing all of the register names */
  36.  
  37. #ifdef DEBUG_REGISTER_NAMES
  38. static char *reg_names[] = DEBUG_REGISTER_NAMES;
  39. #else
  40. static char *reg_names[] = REGISTER_NAMES;
  41. #endif
  42.  
  43. static FILE *outfile;
  44.  
  45. char spaces[] = "                                                                                                                                                                ";
  46.  
  47. static int sawclose = 0;
  48.  
  49. /* Names for patterns.  Non-zero only when linked with insn-output.c.  */
  50.  
  51. extern char **insn_name_ptr;
  52.  
  53. /* Print IN_RTX onto OUTFILE.  This is the recursive part of printing.  */
  54.  
  55. static void
  56. print_rtx (in_rtx)
  57.      register rtx in_rtx;
  58. {
  59.   static int indent;
  60.   register int i, j;
  61.   register char *format_ptr;
  62.   register int is_insn;
  63.  
  64.   if (sawclose)
  65.     {
  66.       fprintf (outfile, "\n%s",
  67.            (spaces + (sizeof spaces - 1 - indent * 2)));
  68.       sawclose = 0;
  69.     }
  70.  
  71.   if (in_rtx == 0)
  72.     {
  73.       fprintf (outfile, "(nil)");
  74.       sawclose = 1;
  75.       return;
  76.     }
  77.  
  78.   /* print name of expression code */
  79.   fprintf (outfile, "(%s", GET_RTX_NAME (GET_CODE (in_rtx)));
  80.  
  81.   if (in_rtx->in_struct)
  82.     fprintf (outfile, "/s");
  83.  
  84.   if (in_rtx->volatil)
  85.     fprintf (outfile, "/v");
  86.  
  87.   if (in_rtx->unchanging)
  88.     fprintf (outfile, "/u");
  89.  
  90.   if (in_rtx->integrated)
  91.     fprintf (outfile, "/i");
  92.  
  93.   if (GET_MODE (in_rtx) != VOIDmode)
  94.     {
  95.       /* Print REG_NOTE names for EXPR_LIST and INSN_LIST.  */
  96.       if (GET_CODE (in_rtx) == EXPR_LIST || GET_CODE (in_rtx) == INSN_LIST)
  97.     fprintf (outfile, ":%s", GET_REG_NOTE_NAME (GET_MODE (in_rtx)));
  98.       else
  99.     fprintf (outfile, ":%s", GET_MODE_NAME (GET_MODE (in_rtx)));
  100.     }
  101.  
  102.   is_insn = (GET_RTX_CLASS (GET_CODE (in_rtx)) == 'i');
  103.   format_ptr = GET_RTX_FORMAT (GET_CODE (in_rtx));
  104.  
  105.   for (i = 0; i < GET_RTX_LENGTH (GET_CODE (in_rtx)); i++)
  106.     switch (*format_ptr++)
  107.       {
  108.       case 'S':
  109.       case 's':
  110.     if (XSTR (in_rtx, i) == 0)
  111.       fprintf (outfile, " \"\"");
  112.     else
  113.       fprintf (outfile, " (\"%s\")", XSTR (in_rtx, i));
  114.     sawclose = 1;
  115.     break;
  116.  
  117.     /* 0 indicates a field for internal use that should not be printed.  */
  118.       case '0':
  119.     break;
  120.  
  121.       case 'e':
  122.     indent += 2;
  123.     if (!sawclose)
  124.       fprintf (outfile, " ");
  125.     print_rtx (XEXP (in_rtx, i));
  126.     indent -= 2;
  127.     break;
  128.  
  129.       case 'E':
  130.       case 'V':
  131.     indent += 2;
  132.     if (sawclose)
  133.       {
  134.         fprintf (outfile, "\n%s",
  135.              (spaces + (sizeof spaces - 1 - indent * 2)));
  136.         sawclose = 0;
  137.       }
  138.     fprintf (outfile, "[ ");
  139.     if (NULL != XVEC (in_rtx, i))
  140.       {
  141.         indent += 2;
  142.         if (XVECLEN (in_rtx, i))
  143.           sawclose = 1;
  144.  
  145.         for (j = 0; j < XVECLEN (in_rtx, i); j++)
  146.           print_rtx (XVECEXP (in_rtx, i, j));
  147.  
  148.         indent -= 2;
  149.       }
  150.     if (sawclose)
  151.       fprintf (outfile, "\n%s",
  152.            (spaces + (sizeof spaces - 1 - indent * 2)));
  153.  
  154.     fprintf (outfile, "] ");
  155.     sawclose = 1;
  156.     indent -= 2;
  157.     break;
  158.  
  159.       case 'w':
  160.     fprintf (outfile,
  161. #if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT
  162.          " %d",
  163. #else
  164.          " %ld",
  165. #endif
  166.          XWINT (in_rtx, i));
  167.     break;
  168.  
  169.       case 'i':
  170.     {
  171.       register int value = XINT (in_rtx, i);
  172.  
  173.       if (GET_CODE (in_rtx) == REG && value < FIRST_PSEUDO_REGISTER)
  174.         {
  175.           fputc (' ', outfile);
  176.           DEBUG_PRINT_REG (in_rtx, 0, outfile);
  177.         }
  178.       else
  179.         fprintf (outfile, " %d", value);
  180.     }
  181.     if (is_insn && &INSN_CODE (in_rtx) == &XINT (in_rtx, i)
  182.         && insn_name_ptr
  183.         && XINT (in_rtx, i) >= 0)
  184.       fprintf (outfile, " {%s}", insn_name_ptr[XINT (in_rtx, i)]);
  185.     sawclose = 0;
  186.     break;
  187.  
  188.       /* Print NOTE_INSN names rather than integer codes.  */
  189.  
  190.       case 'n':
  191.     if (XINT (in_rtx, i) <= 0)
  192.       fprintf (outfile, " %s", GET_NOTE_INSN_NAME (XINT (in_rtx, i)));
  193.     else
  194.       fprintf (outfile, " %d", XINT (in_rtx, i));
  195.     sawclose = 0;
  196.     break;
  197.  
  198.       case 'u':
  199.     if (XEXP (in_rtx, i) != NULL)
  200.       fprintf (outfile, " %d", INSN_UID (XEXP (in_rtx, i)));
  201.     else
  202.       fprintf (outfile, " 0");
  203.     sawclose = 0;
  204.     break;
  205.  
  206.       case '*':
  207.     fprintf (outfile, " Unknown");
  208.     sawclose = 0;
  209.     break;
  210.  
  211.       default:
  212.     fprintf (stderr,
  213.          "switch format wrong in rtl.print_rtx(). format was: %c.\n",
  214.          format_ptr[-1]);
  215.     abort ();
  216.       }
  217.  
  218.   fprintf (outfile, ")");
  219.   sawclose = 1;
  220. }
  221.  
  222. /* Call this function from the debugger to see what X looks like.  */
  223.  
  224. void
  225. debug_rtx (x)
  226.      rtx x;
  227. {
  228.   outfile = stderr;
  229.   print_rtx (x);
  230.   fprintf (stderr, "\n");
  231. }
  232.  
  233. /* External entry point for printing a chain of insns
  234.    starting with RTX_FIRST onto file OUTF.
  235.    A blank line separates insns.
  236.  
  237.    If RTX_FIRST is not an insn, then it alone is printed, with no newline.  */
  238.  
  239. void
  240. print_rtl (outf, rtx_first)
  241.      FILE *outf;
  242.      rtx rtx_first;
  243. {
  244.   register rtx tmp_rtx;
  245.  
  246.   outfile = outf;
  247.   sawclose = 0;
  248.  
  249.   if (rtx_first == 0)
  250.     fprintf (outf, "(nil)\n");
  251.   else
  252.     switch (GET_CODE (rtx_first))
  253.       {
  254.       case INSN:
  255.       case JUMP_INSN:
  256.       case CALL_INSN:
  257.       case NOTE:
  258.       case CODE_LABEL:
  259.       case BARRIER:
  260. #ifdef MPW_C
  261.       /* This fixes a nasty little MPW C bug with for loops.
  262.      The bug example failed in 3.1 and not in 3.2, however this
  263.      code now seems to crash the compiler entirely, so we keep this
  264.      change until things are sorted out. */
  265.       tmp_rtx = rtx_first;
  266.       while (NULL != tmp_rtx)
  267.     {
  268.       print_rtx (tmp_rtx);
  269.       fprintf (outfile, "\n");
  270.       tmp_rtx = NEXT_INSN (tmp_rtx);
  271.     }
  272. #else
  273.     for (tmp_rtx = rtx_first; NULL != tmp_rtx; tmp_rtx = NEXT_INSN (tmp_rtx))
  274.       {
  275.         print_rtx (tmp_rtx);
  276.         fprintf (outfile, "\n");
  277.       }
  278. #endif /* MPW_C */
  279.     break;
  280.  
  281.       default:
  282.     print_rtx (rtx_first);
  283.       }
  284. }
  285.